home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / comm / tcp / samba_2.0.7.lha / examples / validchars / validchr.c < prev    next >
C/C++ Source or Header  |  1996-08-13  |  3KB  |  124 lines

  1. /* by tino@augsburg.net
  2.  */
  3.  
  4. #include <stdio.h>
  5. #include <string.h>
  6.  
  7. #include <dirent.h>
  8.  
  9. unsigned char
  10. test(void)
  11. {
  12.   DIR        *dir;
  13.   struct dirent    *dp;
  14.   unsigned char    c;
  15.  
  16.   if ((dir=opendir("."))==0)
  17.     {
  18.       perror("open .");
  19.       return 0;
  20.     }
  21.   c    = 0;
  22.   while ((dp=readdir(dir))!=0)
  23.     {
  24.       size_t len;
  25.  
  26.       len    = strlen(dp->d_name);
  27.       if (len<4)
  28.     continue;
  29.       if (strcmp(dp->d_name+len-4, ".TST"))
  30.     continue;
  31.       if (len!=5)
  32.     {
  33.       fprintf(stderr, "warning: %s\n", dp->d_name);
  34.       printf(" length");
  35.       continue;
  36.     }
  37.       if (c)
  38.     printf(" double%d\n", c);
  39.       c    = dp->d_name[0];
  40.     }
  41.   if (closedir(dir))
  42.     perror("close .");
  43.   return c;
  44. }
  45.  
  46. int
  47. main(void)
  48. {
  49.   char        name[256];
  50.   unsigned char    map[256], upper[256], lower[256];
  51.   int        i, j, c;
  52.   FILE        *fd;
  53.  
  54.   if (test())
  55.     {
  56.       printf("There are *.TST files, please remove\n");
  57.       return 0;
  58.     }
  59.   for (i=0; ++i<256; )
  60.     {
  61.       lower[i]    = i;
  62.       upper[i]    = 0;
  63.     }
  64.   for (i=256; --i; )
  65.     {
  66.       map[i]    = i;
  67.       strcpy(name, "..TST");
  68.       name[0]    = i;
  69.       printf("%d:", i);
  70.       if ((fd=fopen(name, "w"))==0)
  71.     printf(" open");
  72.       else
  73.     fclose(fd);
  74.       c    = test();
  75.       if (unlink(name))
  76.     printf(" unlink");
  77.       if (c==i)
  78.     printf(" ok");
  79.       else
  80.     printf(" %d", c);
  81.       printf("\n");
  82.       if (c!=i)
  83.     {
  84.       upper[c]++;
  85.       lower[c]    = i;
  86.         }
  87.       map[i]    = c;
  88.     }
  89.  
  90.   /* Uppercase characters are detected above on:
  91.    * The character is mapped to itself and there is a
  92.    * character which maps to it.
  93.    * Lowercase characters are the lowest character pointing to another one.
  94.    * Else it is a one way character.
  95.    *
  96.    * For this reason we have to process the list
  97.    * 1) for 'one way' characters
  98.    *    'one way' is something which is no upper and no lower character.
  99.    *    This is an awful, crude and ugly hack due to missing Samba support.
  100.    * 2) for true uppercase/lowercase characters
  101.    * 3) for standalone characters
  102.    * Note that there might be characters which do not fall into 1 to 3.
  103.    */
  104.   printf("\n   valid chars =");
  105.   for (i=0; ++i<256; )
  106.     if (map[i] && map[i]!=i && lower[map[i]]!=i)
  107.       {
  108.     if (!upper[i])
  109.       printf(" %d:%d %d:%d %d:%d",                    /*1*/
  110.          map[i], i, i, map[i], map[i], map[i]);
  111.     else
  112.       fprintf(stderr, "ignoring map %d->%d because of %d->%d\n",
  113.           lower[i], i, i, map[i]);
  114.       }
  115.   for (i=0; ++i<256; )
  116.     if (map[i] && map[i]==i)
  117.       if (upper[i])
  118.     printf(" %d:%d", lower[i], i);                    /*2*/
  119.       else
  120.     printf(" %d", i);                        /*3*/
  121.   printf("\n");
  122.   return 0;
  123. }
  124.